package com.zhu.instructions.stack;

// instructions/stack/DUP2.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：dup2
 *
 * 操作数：无
 *
 * 功能：
 *  复制栈顶的两个变量（共两个 slot），
 *  并再次压入栈顶。
 *
 * 栈变化：
 *  ..., [v2, v1] → ..., [v2, v1], [v2, v1]
 *
 * 适用类型：
 *  - long、double（占两个 slot）
 *  - 两个连续的 int、float 等
 *
 * 说明：
 *  - 先弹出 v2（高 slot），再弹出 v1（低 slot）
 *  - 压入时保持顺序一致
 */
public class DUP2 extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        Slot slot1 = stack.popSlot();  // v2
        Slot slot2 = stack.popSlot();  // v1

        // 原样压入两次
        stack.pushSlot(slot2);         // v1
        stack.pushSlot(slot1);         // v2
        stack.pushSlot(slot2);         // v1
        stack.pushSlot(slot1);         // v2（dup）
    }
}